package com.fengye.proxy.staticProxy;

// 接口：定义了委托类和代理类共同实现的方法
interface Subject {
    void request();
}

// 委托类：实际执行业务逻辑的类
class RealSubject implements Subject {
    public void request() {
        System.out.println("RealSubject: Handling request.");
    }
}

// 代理类：对委托类进行封装，在调用委托类的方法前后可以执行一些额外的逻辑
class ProxySubject implements Subject {
    private RealSubject realSubject;

    public ProxySubject(RealSubject realSubject) {
        this.realSubject = realSubject;
    }

    public void request() {
        // 在调用委托类方法前执行额外逻辑
        System.out.println("ProxySubject: Before handling request.");

        // 调用委托类的方法
        realSubject.request();

        // 在调用委托类方法后执行额外逻辑
        System.out.println("ProxySubject: After handling request.");
    }
}

// 客户端代码
public class StaticProxyExample {
    public static void main(String[] args) {
        // 创建委托类的实例
        RealSubject realSubject = new RealSubject();

        // 创建代理类的实例，并将委托类的实例传递给代理类
        ProxySubject proxySubject = new ProxySubject(realSubject);

        // 通过代理类调用方法，实际上是调用了委托类的方法，并在前后添加了额外逻辑
        proxySubject.request();
    }
}